package jsonx

import "encoding/json"

// json.Marshal
func Encode(v any) ([]byte, error) {
	return json.Marshal(v)
}

// Encode's panic version
func MustEncode(v any) []byte {
	if output, err := json.Marshal(v); err != nil {
		panic(err)
	} else {
		return output
	}
}

// 反序列化，json.Unmarshal的增强版，在原版的基础上，支持转化[]map[string]any和map[string]any，另外可以被用作结构体数据提取
func Unmarshal(data any, dest any) error {
	// 如果不是[]byte，先序列化
	bytes, ok := dest.([]byte)
	if !ok {
		_bytes, err := json.Marshal(data)
		if err != nil {
			return err
		}
		bytes = _bytes
	}

	if err := json.Unmarshal(bytes, dest); err != nil {
		return err
	} else {
		return nil
	}
}

func Decode(data any, dest any) error {
	return Unmarshal(data, dest)
}
